package com.qfedu.controller;

import com.qfedu.common.core.annotation.NoLogin;
import com.qfedu.common.core.common.R;
import com.qfedu.config.AmapConfig;
import com.qfedu.utils.HttpUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/api/amap")
public class AmapWeatherController {
    private static final Logger log = LoggerFactory.getLogger(AmapWeatherController.class);

    @Resource
    private AmapConfig amapConfig;

    /**
     * 查询天气信息（支持按经纬度或城市代码查询）
     * @param longitude 经度（useCity=false时必填）
     * @param latitude 纬度（useCity=false时必填）
     * @param useCity 是否使用配置的城市代码（默认false）
     * @return 统一响应对象R
     */
    @NoLogin
    @GetMapping("/weather")
    public R getWeatherByLocation(
            @RequestParam(required = false) String longitude,
            @RequestParam(required = false) String latitude,
            @RequestParam(required = false, defaultValue = "false") Boolean useCity) {
        try {
            // 参数校验
            if (useCity && amapConfig.getCity() == null) {
                return R.fail("未配置城市代码，请设置spring.amap.city");
            }
            if (!useCity && (longitude == null || latitude == null)) {
                return R.fail("经纬度参数不能为空");
            }

            log.info("开始查询天气，模式: {}, 参数: {}",
                    useCity ? "城市代码" : "经纬度",
                    useCity ? amapConfig.getCity() : longitude + "," + latitude);

            // 构建请求URL
            String url = buildWeatherRequestUrl(longitude, latitude, useCity);
            log.info("高德API请求URL: {}", url);

            // 调用API
            String response = HttpUtil.doGet(url);
            log.info("高德API响应: {}", response);

            return R.ok(response);
        } catch (Exception e) {
            log.error("查询天气失败", e);
            return R.fail("获取天气失败: " + e.getMessage());
        }
    }

    /**
     * 构建天气请求URL
     * @param useCity true=使用城市代码，false=使用经纬度
     */
    private String buildWeatherRequestUrl(String longitude, String latitude, boolean useCity) {
        Map<String, String> params = new HashMap<>();
        params.put("key", amapConfig.getKey());
        params.put("output", "JSON");
        params.put("extensions", "base");

        // 动态选择查询参数
        if (useCity) {
            params.put("city", amapConfig.getCity());
        } else {
            params.put("location", longitude + "," + latitude);
        }

        // 构建URL
        StringBuilder url = new StringBuilder(amapConfig.getWeatherUrl()).append("?");
        params.forEach((k, v) -> url.append(k).append("=").append(HttpUtil.encodeUrlParam(v)).append("&"));
        return url.substring(0, url.length() - 1); // 移除末尾的"&"
    }
}